<?php
/**
 * PeriodeController.php
 * Classe Controller des Périodes
 */

namespace RHX\Controller;

use RHX\Model\Object\Periode;
use RHX\Model\Object\Semaine;
use RHX\Model\Object\PeriodeSemaine;
use RHX\Helper\RHDateTime;
/**
 * Classe Controller des Périodes
 */
class PeriodeController extends RHXController {

    /**
     * Action par défaut
     * 
     * @return array
     */
    public function indexAction() {
	// Tables
	$periodeTable = $this->getService('Table\PeriodeTable');

	// Prochain Lundi
	$nextMonday = $periodeTable->getNextMonday();

	// Prochain Nom de période
	$nextLabel = $periodeTable->getNextLabel();

	return array(
	    'nextMonday'	 => $nextMonday,
	    'nextLabel'	 => $nextLabel,
	);
    }

    /**
     * Chargement de la liste des périodes
     * 
     * @return array
     */
    public function loadIndexAction() {
	// Changement de Layout
	$this->layout('layout/ajax');

	// Variables
	$page = $this->params()->fromRoute('id', 1);

	// Tables
	$periodeTable = $this->getService('Table\PeriodeTable');

	// Liste des périodes
	$periodeList = $periodeTable->getPeriodes('id DESC', $page, 20);

	return array(
	    'periodeList' => $periodeList,
	);
    }

    /**
     * Rafraichir le formulaire de saisie Nouvelle Période
     *
     * @return array
     */
    public function reloadNewAction() {
	// Changement de layout
	$this->layout('layout/ajax');

	// Tables
	$periodeTable = $this->getService('Table\PeriodeTable');

	// Prochain Lundi
	$nextMonday = $periodeTable->getNextMonday();

	// Prochain Nom de période
	$nextLabel = $periodeTable->getNextLabel();

	return array(
	    'nextMonday'	 => $nextMonday,
	    'nextLabel'	 => $nextLabel,
	);
    }

    /**
     * Liste des Dimanches Prochains au Format JSON
     *
     * @return \Zend\View\Model\JsonModel
     */
    public function jsonSundayListAction() {
	// Tables
	$periodeTable = $this->getService('Table\PeriodeTable');

	// Liste des dimanches
	$nextSundays	 = $periodeTable->getNextSundays();
	$sundays	 = array();
	$date		 = $nextSundays['sunday1']->date();
	$dateFr		 = $nextSundays['sunday1']->dateFr();
	$sundays[$date]	 = $dateFr;
	$date		 = $nextSundays['sunday2']->date();
	$dateFr		 = $nextSundays['sunday2']->dateFr();
	$sundays[$date]	 = $dateFr;
	$date		 = $nextSundays['sunday3']->date();
	$dateFr		 = $nextSundays['sunday3']->dateFr();
	$sundays[$date]	 = $dateFr;
	$date		 = $nextSundays['sunday4']->date();
	$dateFr		 = $nextSundays['sunday4']->dateFr();
	$sundays[$date]	 = $dateFr;
	$date		 = $nextSundays['sunday5']->date();
	$dateFr		 = $nextSundays['sunday5']->dateFr();
	$sundays[$date]	 = $dateFr;

	// Vue
	$view = new \Zend\View\Model\JsonModel($sundays);

	return $view;
    }

    /**
     * Ajouter nouvelle Période
     *
     * @return array
     */
    public function addNewAction() {
	// Changement de layout
	$this->layout('layout/ajax');

	// Tables
	$periodeTable		 = $this->getService('Table\PeriodeTable');
	$periodeSemaineTable	 = $this->getService('Table\PeriodeSemaineTable');
	$semaineTable		 = $this->getService('Table\SemaineTable');

	// Données en Paramètres POST
	$post = $this->getRequest()
		->getPost();

	// Nouvelle Période
	$periode		 = new Periode();
	$periode->libelle	 = /* $post->get('libelle') . ' : ' . */ $post->suffixe;
	$periode->debut		 = $post->get('debut');
	$periode->fin		 = $post->get('fin');
	$periodeId		 = $periodeTable->save($periode);

	// Nouvelle Semaine
	$dateDebut	 = new \DateTime($periode->debut);
	$dateFin	 = new \DateTime($periode->fin);
	$dateFin->modify('next day');
	$jours		 = array('lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi', 'dimanche');
	$dateInterval	 = new \DateInterval('P1W');   // 1 semaine
	$weeks		 = new \DatePeriod($dateDebut, $dateInterval, $dateFin);
	$semaines	 = array();
	$semaineNumber	 = 1;
	$dayInterval	 = new \DateInterval('P1D'); // 1 jour
	// Parcours des Semaines obtenu
	foreach ($weeks as $w) {
	    $end		 = clone $w;
	    $end->modify('next monday');
	    
	    // Jour de la semaine
	    $daysOfWeek	 = new \DatePeriod($w, $dayInterval, $end);
	    $dayNumber	 = 0;
	    $data		 = array();
	    $data['libelle']	 = 'Semaine ' . $semaineNumber++;

	    // Parcours des jours de la semaine
	    foreach ($daysOfWeek as $day) {
		$data[$jours[$dayNumber++]] = $day->format('Y-m-d');
	    }

	    // Sauvegarde de la semaine
	    $semaine	 = new Semaine($data);
	    $semaineId	 = $semaineTable->save($semaine);
	    $semaine->id	 = $semaineId;
	    $semaines[]	 = $semaine;

	    // Sauvegarde dans PeriodeSemaine
	    $periodeSemaine = new PeriodeSemaine(array('periode_id'	 => $periodeId, 'semaine_id'	 => $semaineId));
	    $periodeSemaineTable->save($periodeSemaine);
	}

	return array(
	    'periode'	 => $periode,
	    'semaine'	 => $semaines,
	);
    }

    /**
     * Edition du libellé
     * 
     * @return \Zend\View\Model\JsonModel
     */
    public function editLibelleAction() {
	// changement de layout
	$this->layout('layout/ajax');
	// table
	$tablePeriode	 = new \RHX\Model\Table\PeriodeTable($this->getAdapter());
	// post
	$post		 = $this->getRequest()
		->getPost();
	// Période à modifier
	$periode		 = $tablePeriode->get($post->pk);
	$periode->libelle	 = $post->value;
	$tablePeriode->save($periode);

	return new \Zend\View\Model\JsonModel(array(
	    'periode' => $periode,
	));
    }

    public function changeLastAction() {
	// changement de layout
	$this->layout('layout/ajax');
	// post
	$post			 = $this->getRequest()
		->getPost();
	// table Période
	$tablePeriode		 = new \RHX\Model\Table\PeriodeTable($this->getAdapter());
	// Période à éditer
	$periode		 = $tablePeriode->get($post->pk);
	$oldFin			 = new \RHX\Helper\RHDateTime($periode->fin);
	$newFin			 = new \RHX\Helper\RHDateTime($post->value);
	$periode->fin		 = $newFin->date();
	//$tablePeriode->save($periode);
	// Table PeriodeSemaine
	$tablePeriodeSemaine	 = new \RHX\Model\Table\PeriodeSemaineTable($this->getAdapter());
	$periodeSemaineList	 = $tablePeriodeSemaine->getPeriodeSemaineByPeriode($periode->id);
	// Effacement des périodes semaines
	foreach ($periodeSemaineList as $ps) {
	    $tablePeriodeSemaine->erase($ps->id);
	}
	// Création de nouvelle période semaine
	$periodeId	 = $tablePeriode->save($periode);
	// Table Semaine
	$tableSemaine	 = new \RHX\Model\Table\SemaineTable($this->getAdapter());
	// Nouvelle Semaine
	$dateDebut	 = new \DateTime($periode->debut);
	$dateFin	 = new \DateTime($periode->fin);
	$dateFin->modify('next day');
	$jours		 = array('lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi', 'dimanche');
	$dateInterval	 = new \DateInterval('P1W');   // 1 semaine
	$weeks		 = new \DatePeriod($dateDebut, $dateInterval, $dateFin);
	$semaines	 = array();
	$semaineNumber	 = 1;
	$dayInterval	 = new \DateInterval('P1D'); // 1 jour
	// Parcours des Semaines obtenu
	foreach ($weeks as $w) {
	    $end = clone $w;
	    $end->modify('next monday');

	    // Jour de la semaine
	    $daysOfWeek	 = new \DatePeriod($w, $dayInterval, $end);
	    $dayNumber	 = 0;
	    $data		 = array();
	    $data['libelle'] = 'Semaine ' . $semaineNumber++;

	    // Parcours des jours de la semaine
	    foreach ($daysOfWeek as $day) {
		$data[$jours[$dayNumber++]] = $day->format('Y-m-d');
	    }

	    // Sauvegarde de la semaine
	    $semaine	 = new Semaine($data);
	    $semaineId	 = $tableSemaine->save($semaine);
	    $semaine->id	 = $semaineId;
	    $semaines[]	 = $semaine;

	    // Sauvegarde dans PeriodeSemaine
	    $periodeSemaine = new PeriodeSemaine(array('periode_id'	 => $periodeId, 'semaine_id'	 => $semaineId));
	    $tablePeriodeSemaine->save($periodeSemaine);
	}

	return new \Zend\View\Model\JsonModel(array(
	    'periode'	 => $periode,
	    'semaines'	 => $semaines,
	));
    }
    
    /*
     * recupere les listes des futures debut de périodes
     * @jsonModel
     */
    public function jsonDebutFuturPeriodeAction(){
        // table Période
	$tablePeriode		 = new \RHX\Model\Table\PeriodeTable($this->getAdapter());
        
        $periodes = $tablePeriode->getFuturePeriode();
        
        $debuts  = array();
        foreach($periodes as $periode){
            $debut   = new \RHX\Helper\RHDateTime($periode->debut);            
            $date    = $debut->date();
            $dateFr  = $debut->dateFr();
            
            $debuts[$date] = $dateFr;
        }
        $jsonView = new \Zend\View\Model\JsonModel($debuts);
        
        return $jsonView ;
    }
    
    /*
     * recupere les listes des futures premiers du mois
     * @jsonModel
     */
    public function jsonFirstFuturMonthAction(){
        
        $now = new  RHDateTime('now');
        $dateTimes = $this->firstFuturMonth($now->date('Y') , $now->date('m'), 5);
        
        $dataJson = array();
        foreach($dateTimes as $dateTime):
            $date   = $dateTime->date();
            $dateFr = $dateTime->dateFr(false) ;
            $dataJson [ $date ] = $dateFr;            
        endforeach; 
        
        $jsonView = new \Zend\View\Model\JsonModel($dataJson);        
        return $jsonView ;
    }
    
    /* Recupère les prenmiers du mois 
     * @param int $yearRef année de reference 
     * @param int $monthRef mois de reference 
     * @param int $limit nombre de mois futur 
     * @return array DateTime $resDateTime
     * */
    
    public function firstFuturMonth($yearRef, $monthRef, $limit){
        
        $dateRef = "$yearRef-$monthRef-1";        
        
        $dateTime = new RHDateTime($dateRef);
        
        // retrieve date string
        $dates = array();        
        for($count = 0; $count < $limit ; $count++){              
            $dateTime->modify("+1 month");
            $dates[] = $dateTime->date();
        }
        
        // retrieve dateTime object
        $resDateTime = array();
        foreach($dates as $date):
            $resDateTime[] = new RHDateTime($date);
        endforeach;
        
        return $resDateTime;        
    }

}

